import pymysql
'''
（本地需要安装pymysql）
使用方法：
1.连接数据库，实例化以后使用db_connect()
  传入参数：
      host：数据库地址
      user：数据库账号
      password：数据库密码
      database：数据库库名
2.选择数据表，连接数据库以后使用select_db()
  传入参数：
    db：数据表名称
3.查找一个符合条件的记录select_one()
  传入参数：
      dict：要查找的记录，以字典形式传入
      例如：dict={
        ‘Id‘:1
        ’name‘:'小王'
      }
      op1：可选参数1
      传入’=‘或者’like‘，用于确定精确查找或者模糊查找
      op2：可选参数2
      传入’AND‘或者’OR‘，用于确定查找数据间的关系
      order：查找结果返回顺序，一般为‘asc’升序和‘desc’降序
      by:要根据哪个字段进行排序
      limit：限制查找个数
  返回参数：
    一个列表，列表内为字典，例如：
        [
            {’Id‘:1,’name‘:'小王'},
            {’Id‘:2,’name‘:'小黑'}
        ]3.查找所有符合条件的数据select_all()
  传入参数：
      dict：要查找的记录，以字典形式传入
      例如：dict={
        ‘Id‘:1
        ’name‘:'小王'
      }
      op1：可选参数1
      传入’=‘或者’like‘，用于确定精确查找或者模糊查找
      op2：可选参数2
      传入’AND‘或者’OR‘，用于确定查找数据间的关系
      order：查找结果返回顺序，一般为‘asc’升序和‘desc’降序
      by:要根据哪个字段进行排序
      limit：限制查找个数
  返回参数：
    一个字典，例如：    
        {’Id‘:1,’name‘:'小王'},
4.删除一个记录：delete_one()
  传入参数：
    dict：要删除的数据，以字典形式传入
      例如：dict={
        ‘Id‘:1
        ’name‘:'小王'
      }
      op1：可选参数1
      传入’=‘或者’like‘，用于确定精确查找或者模糊查找
      op2：可选参数2
      传入’AND‘或者’OR‘，用于确定查找数据间的关系
      order：查找结果返回顺序，一般为‘asc’升序和‘desc’降序
      by:要根据哪个字段进行排序
      limit：限制查找个数
5.批量删除记录delete_all()：
  传入参数：
      dict：要删除的数据，以字典形式传入
          例如：dict={
            ‘Id‘:1
            ’name‘:'小王'
          }
      op1：可选参数1
      传入’=‘或者’like‘，用于确定精确查找或者模糊查找
      op2：可选参数2
      传入’AND‘或者’OR‘，用于确定查找数据间的关系
      order：查找结果返回顺序，一般为‘asc’升序和‘desc’降序
      by:要根据哪个字段进行排序
      limit：限制删除个数
6.插入一个记录insert_data_one：
  传入参数：
    dict：要插入的数据，以字典形式传入  
7.更新一条记录update_one():
  传入参数：
    update_dict:要更新的数据，以字典传入(用于更新数据)
    可选其一：
        Id：要更新的记录的Id（需要数据库主键是Id）
    第二种：
      select_dict：要更新的数据的数据（用于查找要更新的数据）
      op1：可选参数1
      传入’=‘或者’like‘，用于确定精确查找或者模糊查找
      op2：可选参数2
      传入’AND‘或者’OR‘，用于确定查找数据间的关系
8.回退rollback()：用于回退会刚刚数据操作前的情况，多用于数据删除失败
'''


class Mysql(object):
    #连接数据库
    def db_connect(self,host='localhost',user='demo',password='******',database='demo'):
        self.host=host
        self.user=user
        self.password=password
        self.database=database
        self.data_base = pymysql.connect(host=self.host, user=self.user, passwd=self.password, database=self.database)
        self.cursor = self.data_base.cursor(cursor=pymysql.cursors.DictCursor)
    def select_db(self,db):
        #选择一个表
        self.db=db
    def select_all(self,dict={},op1="=",op2="AND",order='desc',by='',limit=''):
        #从选择的表中获取数据（全部）
        sql = "SELECT * FROM {0} ".format(self.db)
        if dict:
            sql += "where "
            if op1!='=':
                sql += str(list(dict.keys())[0]) + " " + str(op1) + " '%" + str(dict[list(dict.keys())[0]]) + "%' "
                for i in list(dict.keys())[1:]:
                    sql += str(op2) + " " + str(i) + " " + str(op1) + " '%" + str(dict[i]) + "%'"
            else:
                sql += str(list(dict.keys())[0]) + " " + str(op1) + " '" + str(dict[list(dict.keys())[0]]) + "' "
                for i in list(dict.keys())[1:]:
                    sql += str(op2) + " " + str(i) + " " + str(op1) + " '" + str(dict[i]) + "'"
        if by!='':
            sql+=" order by "+str(by)+" "+str(order)
        if limit!='':
            sql+=" limit "+limit

        self.cursor.execute(sql)
        return self.cursor.fetchall()
    def select_one(self,dict={},op1="=",op2="AND",order='desc',by='',limit=''):
        #从选择的表中获取一个数据
        sql = "SELECT * FROM {0} ".format(self.db)
        if dict:
            sql += "where "
            if op1!='=':
                sql += str(list(dict.keys())[0]) + " " + str(op1) + " '%" + str(dict[list(dict.keys())[0]]) + "%' "
                for i in list(dict.keys())[1:]:
                    sql += str(op2) + " " + str(i) + " " + str(op1) + " '%" + str(dict[i]) + "%'"
            else:
                sql += str(list(dict.keys())[0]) + " " + str(op1) + " '" + str(dict[list(dict.keys())[0]]) + "' "
                for i in list(dict.keys())[1:]:
                    sql += str(op2) + " " + str(i) + " " + str(op1) + " '" + str(dict[i]) + "' "
        if by!='':
            sql+="order by "+str(by)+" "+str(order)+" "
        if limit!='':
            sql+="limit "+str(limit)+" "
        self.cursor.execute(sql)
        return self.cursor.fetchone()
    def delete_one(self,dict={},op1="=",op2="AND",order='desc',by=''):
        #删除一个数据
        sql = "DELETE FROM {0} ".format(self.db)
        if dict:
            sql += "where "
            if op1 != '=':
                sql += str(list(dict.keys())[0]) + " " + str(op1) + " '%" + str(dict[list(dict.keys())[0]]) + "%' "
                for i in list(dict.keys())[1:]:
                    sql += str(op2) + " " + str(i) + " " + str(op1) + " '%" + str(dict[i]) + "%'"
            else:
                sql += str(list(dict.keys())[0]) + " " + str(op1) + " '" + str(dict[list(dict.keys())[0]]) + "' "
                for i in list(dict.keys())[1:]:
                    sql += str(op2) + " " + str(i) + " " + str(op1) + " '" + str(dict[i]) + "' "
        if by != '':
            sql += "order by " + str(by) + " " + str(order) + " "
        sql += "limit 1 "
        self.cursor.execute(sql)
        self.data_base.commit()
    def delete_all(self,dict={},op1="=",op2="AND",order='asc',by='',limit=''):
        #删除所有符合条件的数据
        sql = "DELETE FROM {0} ".format(self.db)
        if dict:
            sql += "where "
            if op1!='=':
                sql += str(list(dict.keys())[0]) + " " + str(op1) + " '%" + str(dict[list(dict.keys())[0]]) + "%' "
                for i in list(dict.keys())[1:]:
                    sql += str(op2) + " " + str(i) + " " + str(op1) + " '%" + str(dict[i]) + "%'"
            else:
                sql += str(list(dict.keys())[0]) + " " + str(op1) + " '" + str(dict[list(dict.keys())[0]]) + "' "
                for i in list(dict.keys())[1:]:
                    sql += str(op2) + " " + str(i) + " " + str(op1) + " '" + str(dict[i]) + "'"
        if by!='':
            sql+=" order by "+str(by)+" "+str(order)
        if limit!='':
            sql+=" limit "+str(limit)
        self.cursor.execute(sql)
        return self.cursor.fetchall()
    def insert_data_one(self,dict={}):
        #插入一个数据（以字典形式传入）
        title=str(list(dict.keys())[0])
        data="'"+str(dict[title])+"'"
        for key in list(dict.keys())[1:]:
            title=title+','+str(key)
            data=str(data)+",'"+str(dict[key])+"\'"
        sql="INSERT INTO "+str(self.db)+" ("+str(title)+") VALUES ("+str(data)+")"
        self.cursor.execute(sql)
        self.data_base.commit()
    def update_one(self,update_dict={},select_dict={},op1="=",op2="AND",Id=-1):
        sql = "UPDATE {0} SET ".format(self.db)
        sql += str(list(update_dict.keys())[0]) + " = '" + str(update_dict[list(update_dict.keys())[0]]) + "'"
        for i in list(update_dict.keys())[1:]:
            sql += "," + str(i) + " = '" + str(update_dict[i]) + "'"
        if select_dict:
            sql += " where "
            if op1 != '=':
                sql += str(list(select_dict.keys())[0]) + " " + str(op1) + " '%" + str(select_dict[list(select_dict.keys())[0]]) + "%' "
                for i in list(select_dict.keys())[1:]:
                    sql += str(op2) + " " + str(i) + " " + str(op1) + " '%" + str(select_dict[i]) + "%'"
            else:
                sql += str(list(select_dict.keys())[0]) + " " + str(op1) + " '" + str(select_dict[list(select_dict.keys())[0]]) + "' "
                for i in list(select_dict.keys())[1:]:
                    sql += str(op2) + " " + str(i) + " " + str(op1) + " '" + str(select_dict[i]) + "' "
        if Id!=-1:
            sql+=" where Id ='"+str(Id)+"'"
        sql+=' limit 1'
        self.cursor.execute(sql)
        self.data_base.commit()
    def rollback(self):
        #回退
        self.data_base.rollback()